package http.secure.common.constant;

import http.secure.common.event.RequestRejectHandler;
import http.secure.common.keys.validator.impl.MappedRepeatValidator;
import http.secure.common.keys.validator.impl.RedisRepeatValidator;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 安全常量配置映射
 */
@Data
@Component
@ConfigurationProperties(prefix = "secure.request")
public class SecureProperties {
    /**
     * 有效链接保存时间（单位：秒）
     * 注意：动态降低此值，可能会有重放攻击的风险。
     *
     * @see RedisRepeatValidator
     * @see MappedRepeatValidator
     */
    private int linkValidTime = 60;
    /**
     * 密钥轮换时间，建议不要设置过长时间（单位：秒）
     */
    private long keyRotationTime = 300;
    /**
     * 每秒最大并发事件数
     * 此配置仅对 {@link MappedRepeatValidator} 有效
     */
    private int maxConcurrencyPerSecond = 10000;
    /**
     * 始终验证请求的 IP 地址唯一性（关闭此配置可能会面临中间人攻击的风险）
     */
    private boolean verifyRequestRemote = true;
    /**
     * 对于同一个会话交换不同的 SM4 密钥（关闭此配置可能导致会话伪造攻击的风险）
     */
    private boolean sameSessionExchangeDiffKey = true;
    /**
     * SM4密钥最大交换时间间隔（单位：ms）
     */
    private long keyExchangeMaxTime = 60000;
    /**
     * 请求/响应验证失败的HTTP错误码
     *
     * @see RequestRejectHandler 手动控制拦截后行为
     */
    private int requestRejctHttpCode = 401;
    /**
     * 内置API相关配置
     */
    private SecureApiProperties api = new SecureApiProperties();
}
